import sys
from PySide6.QtWidgets import (
    QApplication,
    QMainWindow,
    QPushButton,
    QLabel,
    QVBoxLayout,
    QWidget,
    QDialog  # 1. 导入 QDialog
)
from PySide6.QtCore import Qt


# ============================
# 1. 定义子窗口类 (使用 QDialog)
# ============================
class ChildDialog(QDialog):
    def __init__(self, parent=None):
        super().__init__(parent)

        # --- 关键：设置窗口的模态性 ---
        # self.setModal(True)  # 如果取消这行注释，窗口将变为模态窗口

        # 设置子窗口的属性
        self.setWindowTitle("子窗口")
        self.setGeometry(250, 250, 400, 300)  # 相对于屏幕的位置

        # 创建一个布局和控件
        layout = QVBoxLayout(self)

        self.label = QLabel("这是一个子窗口！")
        self.label.setAlignment(Qt.AlignmentFlag.AlignCenter)
        layout.addWidget(self.label)

        self.close_button = QPushButton("关闭子窗口")
        layout.addWidget(self.close_button)

        # 连接关闭按钮的点击信号到窗口的 accept 方法
        # accept() 会关闭对话框并返回 QDialog.Accepted
        self.close_button.clicked.connect(self.accept)


# ============================
# 2. 定义主窗口类
# ============================
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("主窗口")
        self.setGeometry(100, 100, 300, 200)

        central_widget = QWidget()
        self.setCentralWidget(central_widget)
        layout = QVBoxLayout(central_widget)

        # 创建一个用于打开模态子窗口的按钮
        self.open_modal_button = QPushButton("打开模态子窗口")
        layout.addWidget(self.open_modal_button)

        # 创建一个用于打开非模态子窗口的按钮
        self.open_nonmodal_button = QPushButton("打开非模态子窗口")
        layout.addWidget(self.open_nonmodal_button)

        # --- 连接信号和槽 ---
        self.open_modal_button.clicked.connect(self.show_modal_child)
        self.open_nonmodal_button.clicked.connect(self.show_nonmodal_child)

        # 用于存储非模态窗口的引用
        self.nonmodal_dialog = None

    def show_modal_child(self):
        """槽函数：显示一个模态子窗口"""
        print("正在打开模态子窗口...")
        dialog = ChildDialog(self)  # 创建子窗口实例，并传入 self 作为父窗口

        # 使用 exec() 显示模态对话框
        # 程序会在这里阻塞，直到对话框被关闭
        result = dialog.exec()

        # 检查对话框是如何被关闭的
        if result == QDialog.Accepted:
            print("模态子窗口被正常关闭。")
        else:
            print("模态子窗口被取消或关闭。")
        print("主窗口重新获得控制权。")

    def show_nonmodal_child(self):
        """槽函数：显示一个非模态子窗口"""
        print("正在打开非模态子窗口...")

        # 检查窗口是否已存在
        if self.nonmodal_dialog is None:
            # 创建子窗口实例，并传入 self 作为父窗口
            self.nonmodal_dialog = ChildDialog(self)
            # 当窗口关闭时，重置引用
            self.nonmodal_dialog.finished.connect(self.on_nonmodal_closed)

        self.nonmodal_dialog.show()
        print("主窗口仍然可以操作。")

    def on_nonmodal_closed(self):
        """非模态窗口关闭时的回调"""
        print("非模态子窗口已关闭。")
        self.nonmodal_dialog = None


# ============================
# 3. 程序入口
# ============================
if __name__ == "__main__":
    app = QApplication(sys.argv)
    main_window = MainWindow()
    main_window.show()
    sys.exit(app.exec())